#!/usr/bin/enr/python3
# -*- coding: utf-8 -*-
# -------------------------------
# @Author : hurong
# @File : SMS_OOP.py
# @Time : 2023/11/12 17:15
# -------------------------------
'''
作业：
1.按面向过程函数实现的学生管理需求，将学生管理系统修改为面向对象方式实现
2.在现有功能基础上，需将程序运行中操作的数据保存到 data.txt 文件中
3.程序退出时保存数据到文件
4.程序启动时从文件加载数据到程序
'''

import os
# 初始化一个学生基础类，封装学生属性
class Students(object):
    # 魔法方法，初始化实例对象
    def __init__(self, sid, name, gender, age):
        self.sid = sid
        self.name = name
        self.gender = gender
        self.age = age


    # 魔法方法，按照下面格式输出；重写对象的显示格式 方法
    def __str__(self):
        return f"SID:{self.sid} --- Name:{self.name} --- Gender:{self.gender} --- Age:{self.age}"


# 封装管理类
class SMS(object):
    # 定义一个初始化方法
    def __init__(self):
        # 定义一个全局变量来保存学生的信息，方法各个函数之间进行访问
        self._students = []    # 保存Students学生类中的所有实例对象
        # 加载数据
        self.__load_data()


#   打印目录
    def _menu(self):
        print("*" * 40)
        print("*		   学生管理系统     			 *")
        print("*        1. 添加新学生信息              *")
        print("*        2. 通过学号修改学生信息         *")
        print("*        3. 通过学号删除学生信息         *")
        print("*        4. 通过姓名删除学生信息         *")
        print("*        5. 通过学号查询学生信息         *")
        print("*        6. 通过姓名查询学生信息         *")
        print("*        7. 显示所有学生信息             *")
        print("*        8. 退出系统         *")
        print("*" * 40)


    # 定义管理类
    # 实现控制函数，直到输入8，结束程序
    def start(self):
        # 用while循环，if else进行循环判断，知道输入8，break结束循环并退出
        while True:
            # 调用menu()方法,打印菜单
            self._menu()
            select_op = input("输入编号选择操作：")
        # 判断条件
            if len(select_op) == 1 and select_op in "12345678":
                if select_op == "1":
                    sid = self._getSid()
                    sname = self._getSName()
                    sgender = self._getSGender()
                    sage = self._getSAge()
                    self._addStudent(sid,sname,sgender,sage)
                elif select_op == "2":
                    self._modifyStudentByID(sid)
                elif select_op == "3":
                    self._deleteStudentByID(sid)
                elif select_op == "4":
                    self._deleteStudentByName(sname)
                elif select_op == "5":
                    self._queryStudentById(sid)
                elif select_op == "6":
                    self._queryStudentByName(sname)
                elif select_op == "7":
                    self._total_info()
                elif select_op == "8":
                    break
            else:
                print(f"输入内容有误,请重新输入数字1~8进行选择!")


# 获取学生ID的方法
    def _getSid(self):
        sid = input("请输入学生ID：")
        return sid


# 获取学生名字的方法（可针对这个方法进行验证性的判断，不符合的则不让输入进入下一步）
    def _getSName(self):
        sname = input("请输入学生姓名：")
        return sname


    # 获取学生性别的方法
    def _getSGender(self):
        sgender = input("请输入学生性别：")
        return sgender


    # 获取学生age年龄的方法
    def _getSAge(self):
        sage = input("请输入学生年龄：")
        return sage


# 定义添加学生的方法
    def _addStudent(self, sid, name, gender, age):
        # 遍历学生的信息，判断输入的学生id是否已存在
        for s in self._students:
            # 若添加的学生id已存在，则添加失败
            if s.sid == sid:
                print("学号已存在，添加失败")
                return "添加失败"
        else:
            # 实例一个学生对象
            student = Students(sid,name,gender,age)
            # 将已输入需要添加的学生信息，存到_student[]
            self._students.append(student)
            print("添加成功")
            return "添加成功"

    # 定义修改学生信息方法，通过学生编号进行修改
    def _modifyStudentByID(self, sid):
        # 遍历学生信息，输入id是否存在；
        for s in self._students:
            # 若存在，则支持修改(如果输入的学号等于传进来的参数)
            if s.sid == sid :
                # 调用获取姓名方法，修改学生姓名
                name = self._getSName()
                # 修改姓名
                s.name = name
                print("修改成功")
                return "修改成功"
        else:
            print("学号 {sid} 的学生，修改失败，没有对应的学生信息")
            return "修改失败"

    # 通过学生id进行删除学生信息
    def _deleteStudentByID(self, sid):
        # 遍历学生信息，比较输入的学号是否存在列表中
        for s in self._students:
            if s.sid == sid:
                # 执行删除操作
                self._students.remove(s)
                print("删除成功")
                return "删除成功"
        else:
            print(f"没有 {sid} 对应的学生信息")
            return "删除失败"


    # 通过学生姓名，删除所有符合的学生
    def _deleteStudentByName(self, name):
        # 定义一个空字典存放根据id查找到的对应的学生信息
        exist_s = []
        for s in self._students:
            if s.name == name:
                exist_s.append(s)
        # 如果找到学号对应的学生
        if len(exist_s) > 0:
            # 开始执行删除操作
            for s in exist_s:
                self._students.remove(s)
                print(f"姓名为 {name} 的学生删除成功")
            else:
                print(f"成功删除 {len(exist_s)} 个学生")
                return "删除成功"
        else:
            print("该信息不存在，无法删除")
            return "删除失败"


    # 通过学生ID查找学生信息
    def _queryStudentById(self, sid):
        for s in self._students:
            if s.sid == sid:
                print(f"输出查询的学号对应的学生信息{self._students[sid]}")
                return "查询成功"
        else:
            print(f"没有学号为{sid}的学生信息")
            return "查询失败"

    def _queryStudentByName(self, name):
        # 定义一个空列表存储根据学号找到的学生信息
        result = []
        # 校验输入的学号是否有对应学生信息
        for s in self._students:
            if s.name == name:
                # 将找到的学生信息存储到result中；
                result.append(s)
        # 判断是否找到学生信息，result字典中是否有学生信息
        if len(result) > 0:
            print(f"查询学生信息：{result[s]}")
            return "查询成功"
        else:
            print(f"该学生不存在，查询失败")
            return "查询失败"


    # 输出全部学生信息
    def _total_info(self):
        for s in self._students:
            print(s)

# 存储学生信息在信息表中
    def __load_data(self):
        pass


# 程序入口
if __name__ == '__main__':
    # 类的实例化调用
    SMS().start()